package ru.kreda.webapp.client.logic;

import ru.kreda.webapp.client.BusyAsyncCallback;
import ru.kreda.webapp.client.Utils;
import ru.kreda.webapp.client.data.CustomPagingListLoader;
import ru.kreda.webapp.client.invocation.OrderListRequestAction;
import ru.kreda.webapp.client.invocation.OrderListRequestResult;
import ru.kreda.webapp.client.place.OrderListPlace;
import ru.kreda.webapp.shared.model.OrderListFilterModel;
import ru.kreda.webapp.shared.model.OrderModel;

import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.store.ListStore;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;

public class OrderListActivity extends AbstractActivityWithPlace<OrderListPlace> implements IOrderListPresenter {

	public interface ISettingsFormDisplay {

		/**
		 * Получить в виде виджета для отображения в контейнере.
		 */
		Widget asWidget();

		/**
		 * Установить взаимодействие с логикой
		 */
		void setPresenter(IOrderListPresenter presenter);

		void setGridLoader(CustomPagingListLoader<PagingLoadResult<OrderModel>> loader);

		ListStore<OrderModel> getGridStore();

	}

	private final ISettingsFormDisplay display;
	private final CustomPagingListLoader<PagingLoadResult<OrderModel>> loader;

	@Inject
	public OrderListActivity(ISettingsFormDisplay display) {
		this.display = display;
		loader = new CustomPagingListLoader<PagingLoadResult<OrderModel>>() {
			protected void loadData(final Object config) {
				BusyAsyncCallback<OrderListRequestResult> callback = new BusyAsyncCallback<OrderListRequestResult>("загрузка") {
					public void onFailure(Throwable caught) {
						super.onFailure(caught);
						onLoadFailure(config, caught);
					}

					@Override
					protected void handleResult(OrderListRequestResult result) {
						onLoadSuccess(config, result.getResult());

					}
				};
				Utils.getDispatcher().execute(new OrderListRequestAction((OrderListFilterModel) config), callback);
			}
		};
		loader.setRemoteSort(true);
		loader.useLoadConfig(new OrderListFilterModel());
	}

	@Override
	public void start(AcceptsOneWidget container, EventBus eventBus) {
		display.setPresenter(this);
		display.setGridLoader(loader);
		container.setWidget(display.asWidget());
		display.getGridStore().getLoader().load();
	}

	@Override
	public void onStop() {
		display.getGridStore().removeAll();
	}

	@Override
	public String getGroupName() {
		return getPlace().getGroupName();
	}

}
